在這篇教學中,我們將實作 Swift 鬧鐘應用的「選擇鈴聲」畫面。當用戶設定鬧鐘時,能夠從預設的提示聲中選擇自己喜歡的鈴聲,並能夠即時預覽該鈴聲。本文將介紹如何使用 UITableView
顯示可選的鈴聲列表,並利用 AVAudioPlayer
播放選中的鈴聲。
SoundViewController
我們將建立 SoundViewController
,該頁面包含一個 UITableView
,來顯示可供選擇的鈴聲列表。當用戶選擇鈴聲後,將會播放預覽聲音,並透過代理傳遞選擇結果回到上一頁。
import UIKit
import AVFoundation
protocol SoundViewControllerDelegate: AnyObject {
func didSelectSound(_ soundName: String)
}
class SoundViewController: UIViewController {
// MARK: - IBOutlet
@IBOutlet weak var tableView: UITableView!
// MARK: - Property
weak var delegate: SoundViewControllerDelegate?
let sounds = ["馬林巴琴", "鬼畜", "雷達", "sunkis trust me", "Huu"]
var selectedSoundIndex: Int = 0
var audioPlayer: AVAudioPlayer?
var currentSelectedSound: String?
// MARK: - LifeCycle
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
if let currentSound = currentSelectedSound,
let index = sounds.firstIndex(of: currentSound) {
selectedSoundIndex = index
}
}
}
sounds
: 存放可供選擇的鈴聲名稱。selectedSoundIndex
: 記錄目前選中的鈴聲索引,以便在畫面中顯示選中的狀態。audioPlayer
: 用來播放選中鈴聲的音頻播放器。delegate
: 用來回傳選中鈴聲的代理。當頁面載入時,我們會根據用戶之前選擇的鈴聲來初始化 selectedSoundIndex
,以便顯示當前選擇的鈴聲。
我們在 setupUI()
方法中設定頁面的標題、註冊 UITableViewCell 並指定 UITableView
的 delegate
與 dataSource
。另外,我們還在導航欄中加入「完成」按鈕,當用戶選擇好鈴聲後,可以透過此按鈕完成操作並回到上一頁。
// MARK: - UI Settings
func setupUI() {
title = "提示聲"
tableView.register(UINib(nibName: "SoundTableViewCell", bundle: nil), forCellReuseIdentifier: SoundTableViewCell.identifier)
tableView.delegate = self
tableView.dataSource = self
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "完成", style: .plain, target: self, action: #selector(doneTapped))
}
當用戶選擇完鈴聲後,點擊「完成」按鈕將觸發 doneTapped()
,該方法會將用戶選中的鈴聲名稱透過代理傳遞給前一個頁面,並關閉 SoundViewController
。
// MARK: - IBAction
@objc func doneTapped() {
delegate?.didSelectSound(sounds[selectedSoundIndex])
navigationController?.popViewController(animated: true)
}
為了讓用戶從鈴聲列表中進行選擇,我們使用 UITableView
來展示可供選擇的鈴聲名稱。每當用戶選擇一個鈴聲時,會播放對應的鈴聲並在畫面上顯示選中的狀態(checkmark)。
// MARK: - Extensions
extension SoundViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return sounds.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "SoundTableViewCell", for: indexPath) as! SoundTableViewCell
cell.lbTest.text = sounds[indexPath.row]
cell.accessoryType = indexPath.row == selectedSoundIndex ? .checkmark : .none
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
selectedSoundIndex = indexPath.row
tableView.reloadData()
playSound(named: sounds[indexPath.row])
}
}
numberOfRowsInSection
: 回傳鈴聲數量,告訴 UITableView 需要顯示多少行。cellForRowAt
: 設定每個單元格顯示的鈴聲名稱,並根據 selectedSoundIndex
來顯示是否被選中(用 checkmark 標示)。didSelectRowAt
: 當用戶點擊某個單元格時,會更新 selectedSoundIndex
,播放選中的鈴聲,並即時更新畫面。每當用戶選擇不同的鈴聲時,會透過 playSound(named:)
方法播放對應的音效。該方法會使用 AVAudioPlayer
播放 .mp3
格式的鈴聲,並在 Bundle
中查找該檔案。
// MARK: - Function
func playSound(named name: String) {
guard let url = Bundle.main.url(forResource: name, withExtension: "mp3") else { return }
do {
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer?.play()
} catch {
print("無法播放音效: \(error.localizedDescription)")
}
}
如果找不到指定的音檔,或播放過程中出現錯誤,我們會在控制台顯示錯誤訊息,幫助開發者追蹤問題。
在這篇文章中,我們實現了 Swift 鬧鐘應用的「選擇鈴聲」功能,用戶可以從預設的鈴聲列表中選擇自己喜歡的提示聲,並能夠即時預覽。此功能透過 UITableView
顯示鈴聲名稱,並使用 AVAudioPlayer
播放音效,為應用帶來更加直觀的用戶體驗。
接下來,您可以將選擇的鈴聲與鬧鐘設定整合,讓用戶能夠儲存選中的鈴聲並在鬧鐘響起時播放。